// 浅拷贝：只考虑对象类型。
function shallowCopy (obj) {
  if (typeof obj !== 'object') { // 不是对象类型直接返回
    return obj
  }
  let newObj = obj instanceof Array ? [] : {} // 判断是不是数组 是数组就[] 不是数组就{}
  for (let key in obj) { // 遍历每一个key
    if (obj.hasOwnProperty(key)) { // 必须是自身的key不能是继承的
      newObj[key] = obj[key] // 复制到新对象上
    }
  }
  return newObj // 返回新对象
}

// 简单版深拷贝：只考虑普通对象属性，不考虑内置对象和函数。简易深拷贝 修改拷贝后的东西不会影响前面的
// function deepClone (obj) {
//   if (typeof obj !== 'object') {
//     return obj
//   }
//   let newObj = obj instanceof Array ? [] : {}
//   for (let key in obj) {
//     if (obj.hasOwnProperty(key)) {
//       newObj[key] = deepClone(obj[key])
//     }
//   }
//   return newObj
// }
// let a = {
//   name: '方现伟',
//   hobby: ['吃饭', '睡觉', '打豆豆'],
//   power: {
//     '馒头': 20,
//     '包子': 30
//   }
// }
// let b = deepClone(a)
// b.name = '王晶晶'
// b.hobby.push('拉屎')
// b.power['馒头'] = 30
// console.log(a);
// console.log(b);

// 复杂版深克隆：基于简单版的基础上，还考虑了内置对象比如 Date、RegExp 等对象和函数以及解决了循环引用的问题。
// const isObject = (target) => (typeof target === "object" || typeof target === "function") && target !== null;
// function deepClone1(target,map = new WeakMap()){
//   if(map.get(target)){
//     return target
//   }
//   let constructor = target.constructor;
//   if(/^(RegExp|Date)$/i.test(constructor.name)){
//     return new constructor(target);
//   }
//   if(isObject(target)){
//     map.set(target,true)
//     const cloneTarget = Array.isArray(target) ? [] : {};
//     for(let prop in target){
//       if(target.hasOwnProperty(prop)){
//         cloneTarget[prop] = deepClone1(target[prop], map);
//       }
//     }
//     return cloneTarget
//   }else{
//     return target
//   }
// }
// const isObject = (target) => (typeof target === "object" || typeof target === "function") && target !== null;

// function deepClone1 (target, map = new WeakMap()) {
//   if (map.get(target)) {
//     return target;
//   }
//   // 获取当前值的构造函数：获取它的类型
//   let constructor = target.constructor;
//   // 检测当前对象target是否与正则、日期格式对象匹配
//   if (/^(RegExp|Date)$/i.test(constructor.name)) {
//     // 创建一个新的特殊对象(正则类/日期类)的实例
//     return new constructor(target);
//   }
//   if (isObject(target)) {
//     map.set(target, true);  // 为循环引用的对象做标记
//     const cloneTarget = Array.isArray(target) ? [] : {};
//     for (let prop in target) {
//       if (target.hasOwnProperty(prop)) {
//         cloneTarget[prop] = deepClone(target[prop], map);
//       }
//     }
//     return cloneTarget;
//   } else {
//     return target;
//   }
// }
// let c = {
//   name: '方现伟',
//   hobby: ['吃饭', '睡觉', '打豆豆'],
//   power: {
//     '馒头': 20,
//     '包子': 30
//   },
//   say: function () {
//     console.log('我喜欢吃' + this.hobby[0]);
//   }
// }
// let d = deepClone1(c)
// d.name = '王晶晶'
// d.hobby.push('拉屎')
// d.power['馒头'] = 30
// console.log(c);
// console.log(d);
// d.say()